/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.inve.view.mbean;

import com.brain.conf.dto.AlmacenDto;
import com.brain.conf.dto.AlmacenUbicacionDto;
import com.brain.conf.dto.ProductoDetaDto;
import com.brain.conf.manager.AlmacenManager;
import com.brain.core.common.ExportarExcelInve;
import com.brain.core.common.ExportarExcelInve.Stock;
import com.brain.core.common.UtilCore;
import com.brain.core.view.mbean.*;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.RecursosManager;
import com.brain.inve.dto.StockDto;
import com.brain.inve.manager.StockManager;

import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.inve.dto.HistorialStockDto;
import com.brain.inve.manager.HistorialStockManager;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Indra
 */
@Controller("stockMBean")
@Scope("session")
public class StockMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(StockMBean.class);
    @Resource
    private StockManager manager;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private HistorialStockManager historialStockManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    private List<StockDto> lista;
    private List<AlmacenDto> listaAlmacen;
    private List<AlmacenUbicacionDto> listaAlmacenUbicacion;
    private StockDto dtoFiltro;
    private StockDto dto;
    private List<HistorialStockDto> listaHistorialStockDto;
    private String keyEntidad = "key.entidad.stock";
    private String tituloDetalle;
    private StockDto[] selectedSs;
    private ExportarExcelInve.Stock sExcel;
    private String tipoXls;
    private Boolean checkExcel;

    public StockMBean() {
        this.dtoFiltro = new StockDto();
    }

    public String iniciar() {
        this.lista = null;
        this.listaHistorialStockDto = null;
        this.dtoFiltro = new StockDto();
        this.dtoFiltro.setAlmacenDto(manager.obtenerAlmacenPorDefault());
        this.listaAlmacenUbicacion = this.dtoFiltro.getAlmacenDto().getListaAlmacenUbicacion();
        this.sExcel = new ExportarExcelInve.Stock(true);
        this.selectedSs = null;
        return manager.getUrlLista();
    }

    public void buscar() {
        try {
            this.lista = this.manager.obtener(this.dtoFiltro);
            int cont = 0;
            for(StockDto x:this.lista){
                cont ++;
                x.setIdAuxiliar(cont);
            }
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
    }

    public void obtenerAlmUbiPorAlmacen() {
        this.listaAlmacenUbicacion = this.dtoFiltro.getAlmacenDto().getListaAlmacenUbicacion();
    }

    public void visualizarMovimiento(HistorialStockDto dto) {
        RequestContext context = RequestContext.getCurrentInstance();
        int resultado = 1;
        if (dto.getTipoMovimiento().equals("MO")) {
            GuiaRemisionMBean guiaRemisionMBean = (GuiaRemisionMBean) WebServletContextListener.getApplicationContext().getBean("guiaRemisionMBean");
            guiaRemisionMBean.verInfo(dto.getMovimiento());
        } else if (dto.getTipoMovimiento().equals("IU")) {
            resultado = 2;
            IntercambioUbicaMBean intercambioUbicaMBean = (IntercambioUbicaMBean) WebServletContextListener.getApplicationContext().getBean("intercambioUbicaMBean");
            intercambioUbicaMBean.verInfo(dto.getMovimiento());
        }else if(dto.getTipoMovimiento().equals("TU")) {
            resultado = 3;
            TransfUnidadMedidaMBean transfUnidadMedidaMBean = (TransfUnidadMedidaMBean) WebServletContextListener.getApplicationContext().getBean("transfUnidadMedidaMBean");
            transfUnidadMedidaMBean.verInfo(dto.getMovimiento());
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void cargarPopupHistorialMovimientos() {
        try {
            this.listaHistorialStockDto = historialStockManager.obtenerHistorialPorProductoDetaYAlmUbi(dto);
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
    }
    
    public void cargarPopupHistorialMovimientos(ProductoDetaDto prodDetaDto) {
        try {
            this.listaHistorialStockDto = historialStockManager.obtenerHistorialPorProductoDeta(prodDetaDto);
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
    }

    public String retroceder() {
        buscar();
        return manager.getUrlLista();
    }

    private void generarExcelPorTablaHistorialStock() {
        this.manager.generarExcelPorTabla(sExcel, lista);
    }

    private void generarExcelSeleccionadosHistorialStock() {        
        this.manager.generarExcelSeleccionados(sExcel, selectedSs);
    }

    public void exportarExcel() {
        if (this.tipoXls.equals("T")) {
            generarExcelPorTablaHistorialStock();
        } else if (this.tipoXls.equals("S")) {
            generarExcelSeleccionadosHistorialStock();
        }
    }

    public void cargarPopupExportarExcel(String tipo) {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        this.tipoXls = tipo;
        if (tipo.equals("T")) {
            if (lista.isEmpty()) {
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.stock"));
            }
        } else if (tipo.equals("S")) {
            if (selectedSs != null) {
                if (selectedSs.length <= 0) {
                    resultado = false;
                    this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.stock"));
                }
            } else {
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.stock"));
            }
        }
        if (resultado) {
            this.sExcel = new ExportarExcelInve.Stock(true);
            this.checkExcel = Boolean.TRUE;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void onChangeChekExcel() {
        this.sExcel = manager.onChangeChekExcel(checkExcel);
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        StockMBean.logger = logger;
    }

    public StockManager getManager() {
        return manager;
    }

    public void setManager(StockManager manager) {
        this.manager = manager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<StockDto> getLista() {
        return lista;
    }

    public void setLista(List<StockDto> lista) {
        this.lista = lista;
    }

    public StockDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(StockDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public List<AlmacenDto> getListaAlmacen() throws DAOException {
        AlmacenManager almacenManager = (AlmacenManager) WebServletContextListener.getApplicationContext().getBean("almacenManager");
        listaAlmacen = almacenManager.obtenerTodos();
        return listaAlmacen;
    }

    public void setListaAlmacen(List<AlmacenDto> listaAlmacen) {
        this.listaAlmacen = listaAlmacen;
    }

    public List<AlmacenUbicacionDto> getListaAlmacenUbicacion() throws DAOException {

        return listaAlmacenUbicacion;
    }

    public void setListaAlmacenUbicacion(List<AlmacenUbicacionDto> listaAlmacenUbicacion) {
        this.listaAlmacenUbicacion = listaAlmacenUbicacion;
    }

    public List<HistorialStockDto> getListaHistorialStockDto() {
        return listaHistorialStockDto;
    }

    public void setListaHistorialStockDto(List<HistorialStockDto> listaHistorialStockDto) {
        this.listaHistorialStockDto = listaHistorialStockDto;
    }

    public StockDto getDto() {
        return dto;
    }

    public void setDto(StockDto dto) {
        this.dto = dto;
    }

    public String getTipoXls() {
        return tipoXls;
    }

    public void setTipoXls(String tipoXls) {
        this.tipoXls = tipoXls;
    }

    public Boolean getCheckExcel() {
        return checkExcel;
    }

    public void setCheckExcel(Boolean checkExcel) {
        this.checkExcel = checkExcel;
    }

    public Stock getsExcel() {
        return sExcel;
    }

    public void setsExcel(Stock sExcel) {
        this.sExcel = sExcel;
    }

    public StockDto[] getSelectedSs() {
        return selectedSs;
    }

    public void setSelectedSs(StockDto[] selectedSs) {
        this.selectedSs = selectedSs;
    }
    
    
}